// user.ts - 用户状态管理模块
// 这个文件使用Zustand管理用户相关的状态，包括登录状态、用户信息、权限等

// 导入Zustand的create函数：用于创建状态存储
import { create } from 'zustand';
// 导入persist中间件：用于将状态持久化到localStorage，页面刷新后用户登录状态不会丢失
import { persist } from 'zustand/middleware';

// 定义用户状态的接口（TypeScript类型定义）
// 接口描述了用户状态的结构和类型，确保类型安全
interface UserState {
  // 用户信息字段
  account: string; // 用户账号：存储用户的登录账号
  token: string;   // 认证令牌：存储JWT token或其他认证token，用于API请求认证
  avatar: string;  // 用户头像：存储用户头像的URL或base64数据
  permissions: string[]; // 权限列表：存储用户拥有的权限字符串数组
  
  // 登录状态字段
  isLogin: boolean; // 是否登录：true表示已登录，false表示未登录
  
  // 用户操作方法（这些是函数类型定义）
  login: (token: string) => void; // 登录方法：接收token参数，设置登录状态
  logout: () => void; // 登出方法：清空所有用户信息，退出登录状态
  updateUserInfo: (account: string, avatar: string) => void; // 更新用户信息：更新账号和头像
  updatePermissions: (permissions: string[]) => void; // 更新权限：更新用户权限列表
}

// 创建并导出用户状态存储
// useUserStore是一个自定义Hook，可以在React组件中使用
// create<UserState>() 创建了一个类型安全的Zustand store
// persist 中间件将用户状态持久化到localStorage，保持登录状态
export const useUserStore = create<UserState>()(
  persist(
    // set函数用于更新状态，类似于React的setState
    (set) => ({
      // 默认值：用户的初始状态（未登录状态）
      account: '',      // 默认账号为空
      token: '',        // 默认token为空
      avatar: '',       // 默认头像为空
      permissions: [],  // 默认权限为空数组
      isLogin: false,   // 默认未登录
      
      // 登录方法：设置token和登录状态
      // 在React中，调用set函数会触发组件重新渲染
      login: (token) => set({
        token,         // 设置token
        isLogin: true  // 设置登录状态为true
      }),
      
      // 登出方法：清空所有用户信息，重置为未登录状态
      logout: () => set({
        account: '',     // 清空账号
        token: '',       // 清空token
        avatar: '',      // 清空头像
        permissions: [], // 清空权限
        isLogin: false   // 设置登录状态为false
      }),
      
      // 更新用户信息：更新账号和头像（通常在登录后获取用户详细信息时调用）
      updateUserInfo: (account, avatar) => set({
        account, // 更新账号
        avatar   // 更新头像
      }),
      
      // 更新权限：设置用户的权限列表（通常在登录后获取用户权限时调用）
      updatePermissions: (permissions) => set({
        permissions // 更新权限数组
      }),
    }),
    {
      name: 'user-storage', // 本地存储的键名：在localStorage中存储的key
    }
  )
);